<?php


// 我们的文章是直接存储在 D:\wamp\www\part18\static\text\user 下的，数据库没有对应 user 上传的文章：只能上传和访问。
// 就是简单模拟一下，功能简陋哈哈哈

class Text{
    public function __construct($conn){
        // 把 $conn 变成了一个成员变量，下面的成员函数就不用传参 $conn 了
        $this->conn = $conn; 
    }

    public function __destruct(){
        $this->conn->close();
    }

    public function uploadText($textName){
        // "text/plain"
        $allowedExts = array("txt");
        ini_set('upload_max_filesize', '20M'); // 设置 txt 文件可上传的大小
        $temp = explode(".", $_FILES["file"]["name"]);
        echo "文件大小: " . $_FILES["file"]["size"] . "<br>"; // 文件大小
        $extension = end($temp); // 获取文件后缀名

        //  时间的格式不然报错：Incorrect date value: '1703317241' for column 'time' at row 1
        $time = date("Y-m-d H:i:s", time()); // 文章上传时间

        if($_FILES["file"]["type"] == "text/plain" && $_FILES["file"]["size"] < 2048000 && in_array($extension, $allowedExts)){
            if($_FILES["file"]["error"] > 0){
                echo "错误：" . $_FILES["file"]["error"] . "<br>";
                return;
            }else{
                // echo "上传文件名：" . $_FILES["file"]["name"] . "<br>";
                // echo "文件类型：" . $_FILES["file"]["type"] . "<br>";
                // echo "文件大小：" . ($_FILES["file"]["size"] / 1024) . " KB<br>";
                // echo "文件临时存储的位置：" . $_FILES["file"]["tmp_name"] . "<br>";
            }

            // 判断 ../../static/text/user/ 目录是否存在该文件
            // 如果没有，你需要创建它，权限为 777
            if(file_exists("../../static/text/user/" . $_FILES["file"]["name"])){
                echo $_FILES["file"]["name"] . " 文件已经存在。";

                $textPath = "../../static/text/user/" . $_FILES["file"]["name"]; 
                // 数据库里面也是要查看有没有对应的文章的哦
                if($this->selectTextPath($textPath) == true){

                }else{
                    $this->updateMysqlAvatar($textPath, $time);
                }

                // 把 {执行成功与否} 和 {文件路径} 和 {上传时间} 用数组都给返回了
                $result = array("status" => false, "textPath" => $textPath, "time" => $time);
                return $result;
            }else{
                move_uploaded_file($_FILES["file"]["tmp_name"], "../../static/text/user/" . $_FILES["file"]["name"]);
                // echo "文件存储在：" . "../../static/text/user/" . $_FILES["file"]["name"];
                $textPath = "../../static/text/user/" . $_FILES["file"]["name"]; 
                // 数据库里面也是要查看有没有对应的文章的哦
                if($this->selectTextPath($textPath) == true){

                }else{
                    $this->updateMysqlAvatar($textPath, $time);
                }

                // 把 {执行成功与否} 和 {文件路径} 和 {上传时间} 用数组都给返回了
                $result = array("status" => true, "textPath" => $textPath, "time" => $time);
                return $result;
            }
        }else{
            // 把 {执行成功与否} 和 {文件路径} 和 {上传时间} 用数组都给返回了
            $result = array("status" => false, "textPath" => "", "time" => $time);
            return $result;
        }

        // 把 {执行成功与否} 和 {文件路径} 和 {上传时间} 用数组都给返回了
        $result = array("status" => false, "textPath" => "", "time" => $time);
        return $result;
    }
    // 先查找有没有 $textPath
    public function selectTextPath($textPath){
        // 执行查询
        $sql = "SELECT time FROM texts WHERE textPath = ?";
        $mysqli_stmt = $this->conn->prepare($sql); // 准备预处理语句

        // s: string/date   i: int
        $mysqli_stmt->bind_param('s', $textPath);

        // 检查查询结果
        $result = null;

        // 执行预处理的语句
        if($mysqli_stmt->execute()){

            // 遍历结果集
            if($mysqli_stmt->fetch()){
                $result = true;
            }
        }else{            
            $result = false;
        }
        $mysqli_stmt->free_result();
        $mysqli_stmt->close();
        // $this->conn->close();

        return $result;
    }
    // 更新数据库的代码
    private function updateMysqlAvatar($textPath, $time){
        $sql = "INSERT INTO texts(textPath, time) VALUES(?, ?)";
        $mysqli_stmt = $this->conn->prepare($sql); // 准备预处理语句
        
        // s: string/date   i: int
        $mysqli_stmt->bind_param('ss', $textPath, $time);

        // 执行预处理的语句
        if($mysqli_stmt->execute()){
            echo PHP_EOL . "文件上传成功";

        }else{
            echo $mysqli_stmt->error . "文件上传失败"; // 执行失败，展示错误信息
        }
        $mysqli_stmt->free_result();
        $mysqli_stmt->close();
        // $this->conn->close();
    }

    // user 上传的文章都在 D:\wamp\www\part18\static\text\user 下，只要把他们的文件名都获取到，通过 json 数组返回所有的文件名即可
    // json_encode("count" => $count, "texts" => array(......));
    // 查询所有数据库的文章名返回 json 数据
    public function getTextList(){
        // 执行查询
        $sql = "SELECT * FROM texts";
        $result = $this->conn->query($sql);

        // 检查查询结果
        $texts = array(); // 存放查询结果的数组
        
        if($result){
            $res = $result->fetch_all();
            // var_dump($res);

            // 打印大页面上
            foreach($res as $k=>$v){
                // var_dump($v); // $v 还是一个数组的哦
                // foreach($v as $kk=>$vv){
                //     array_push($texts, $vv);
                //     break;
                // }
                    
                array_push($texts, $v[0]);
            }
        }

        // $mysqli_stmt->free_result();
        // $mysqli_stmt->close();
        // $this->conn->close();

        return $texts;
    }

    // 返回前端对应的 textName 文章：$textPath = "../../static/text/user/" . $textName; 
    public function getText($textName){
        // $textName 是我们需要查看的文件名，user 上传的文章都是存储在 "../../static/text/user/" 路径下的，所以就可以退出准确的路径 $textPath
        $textPath = "../../static/text/user/" . $textName; 

        $textContent = "";

        // 先用 file_exists 函数来检查文件是否存在
        if(file_exists($textPath) == true){
            $textContent = file_get_contents($textPath);
        }else{
            echo "<script>alert('文件不存在!!!');</script>";
            return array("status" => false, "textContent" => "文件不存在");
        }
        // echo "<script>alert('$textPath');</script>"; // debug

        // 检查文件是否成功读取
        if ($textContent !== false) {
            // 文件读取成功，可以对内容进行处理
            // echo $textContent;
            // echo "<script>alert('$textContent');</script>";

            return array("status" => true, "textContent" => $textContent);
        } else {
            // 文件读取失败
            // echo "无法读取文件";
            echo "<script>alert('无法读取文件!!!');</script>";
            return array("status" => false, "textContent" => $textContent);
        }

        return array("status" => false, "textContent" => $textContent);
    }
};